package cn.hinglo.gameclaw.admin.service;

import cn.hinglo.gameclaw.admin.dao.MenuDao;
import cn.hinglo.gameclaw.data.entity.Result;
import cn.hinglo.gameclaw.data.utils.IdUtils;
import cn.hinglo.gameclaw.data.utils.ResultUtils;
import cn.hinglo.gameclaw.user.bean.Menu;
import cn.hutool.core.util.StrUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import java.util.Comparator;
import java.util.Date;
import java.util.List;

import static cn.hinglo.gameclaw.data.utils.CheckDataUtils.checkIdResultUtils;


/**
 * @createTime: 2017/12/29
 * @author: HingLo
 * @description: 菜单管理的服务层
 */
@Service
@CacheConfig(cacheNames = "menu")
public class MenuService {
    private final MenuDao menuDao;

    @Autowired
    public MenuService(MenuDao menuDao) {
        this.menuDao = menuDao;
    }

    /**
     * 添加菜单方法
     *
     * @param menu 菜单对象
     * @return 添加结果
     */
    @CacheEvict(allEntries = true)
    public boolean addMenuService(Menu menu) {
        menu.setId(IdUtils.getId()).setDate(new Date());
        return menuDao.insert(menu) > 0;
    }

    /**
     * 通过菜单的ID删除菜单，若果有娃娃机依赖于该菜单，则一并删除
     *
     * @param id 分类的唯一Id
     * @return 返回结果
     */
    @CacheEvict(allEntries = true)
    public boolean deleteMenuService(String id) {
        //检测Id格式是否符合要求
        checkIdResultUtils(id);
        return menuDao.deleteByPrimaryKey(id) > 0;
    }

    /**
     * 查询菜单信息，并排序
     *
     * @return 分类的结合
     */
    @Cacheable
    public Result listMenuService() {
        List<Menu> list = menuDao.selectAll();
        //升序排序
        list.sort(Comparator.comparingInt(Menu::getSort));
        return ResultUtils.success(list);
    }

    /**
     * 修改分类的名称
     *
     * @param id   分类的唯一Id
     * @param name 分类的名称
     * @param sort 权重值
     * @return 修改结果
     */
    @CacheEvict(allEntries = true)
    public boolean changeMenuService(String id, String name, int sort) {
        //检测Id格式是否符合要求
        checkIdResultUtils(id);
        Menu menu = new Menu().setId(id).setName(name).setSort(sort);
        return StrUtil.isNotBlank(name) && name.length() > 1 && menuDao.updateByPrimaryKeySelective(menu) == 1;
    }
}
